package com.topcent.tioxyc.controller;

/**
 * @author: 陈百万
 * @date: 2025/6/12 15:48
 * @Description: 继电器测试
 */
import com.fazecast.jSerialComm.SerialPort;
import java.util.Scanner;

/**
 * USB继电器控制程序
 * 支持自动查找USB串口，发送开关指令，并提供交互界面
 */
public class UsbRelayController {
    private SerialPort serialPort;
    private static final int BAUD_RATE = 9600; // 波特率，根据继电器模块调整

    // 假设的继电器指令（请根据实际继电器手册修改）
    private static final byte[] CMD_ON = {(byte) 0xA0, 0x01, 0x01, (byte) 0xA2};  // 开启指令
    private static final byte[] CMD_OFF = {(byte) 0xA0, 0x01, 0x00, (byte) 0xA1}; // 关闭指令

    /**
     * 初始化串口并连接到USB继电器
     * @param portName 串口名称，如"COM3"或"/dev/ttyUSB0"
     * @return 初始化是否成功
     */
    public boolean init(String portName) {
        serialPort = SerialPort.getCommPort(portName);
        serialPort.setBaudRate(BAUD_RATE);
        serialPort.setNumDataBits(8);
        serialPort.setNumStopBits(1);
        serialPort.setParity(SerialPort.NO_PARITY);

        if (serialPort.openPort()) {
            System.out.println("成功连接到继电器：" + portName);
            return true;
        } else {
            System.out.println("连接失败，请检查串口名称和权限");
            return false;
        }
    }

    /**
     * 发送指令到继电器
     * @param cmd 指令字节数组
     * @return 发送是否成功
     */
    public boolean sendCommand(byte[] cmd) {
        if (serialPort == null || !serialPort.isOpen()) {
            System.out.println("串口未打开，无法发送指令");
            return false;
        }

        int bytesWritten = serialPort.writeBytes(cmd, cmd.length);
        if (bytesWritten == cmd.length) {
            System.out.println("指令发送成功: " + bytesToHex(cmd));
            return true;
        } else {
            System.out.println("指令发送失败，仅发送了 " + bytesWritten + " 字节");
            return false;
        }
    }

    /**
     * 关闭串口连接
     */
    public void close() {
        if (serialPort != null && serialPort.isOpen()) {
            serialPort.closePort();
            System.out.println("已关闭串口连接");
        }
    }

    /**
     * 字节数组转十六进制字符串（用于日志）
     */
    private String bytesToHex(byte[] bytes) {
        StringBuilder result = new StringBuilder();
        for (byte b : bytes) {
            result.append(String.format("%02X ", b));
        }
        return result.toString();
    }

    /**
     * 自动查找USB串口设备
     * @return 找到的USB串口名称，若无则返回null
     */
    public static String findUsbRelayPort() {
        SerialPort[] ports = SerialPort.getCommPorts();
        System.out.println("可用串口列表：");
        int usbPortIndex = -1;

        for (int i = 0; i < ports.length; i++) {
            String portName = ports[i].getSystemPortName();
            String description = ports[i].getDescriptivePortName();
            System.out.println((i + 1) + ". " + portName + " - " + description);

            // 尝试匹配USB串口（不同设备描述可能不同，需根据实际情况调整）
            if (description.toLowerCase().contains("usb") ||
                    description.toLowerCase().contains("relay")) {
                usbPortIndex = i;
            }
        }

        if (usbPortIndex >= 0) {
            System.out.println("检测到可能的USB继电器端口: " + ports[usbPortIndex].getSystemPortName());
            return ports[usbPortIndex].getSystemPortName();
        } else if (ports.length > 0) {
            System.out.println("未检测到明确的USB继电器端口，建议选择第一个端口尝试");
            return ports[0].getSystemPortName();
        } else {
            System.out.println("未检测到任何串口设备，请检查USB继电器是否已连接");
            return null;
        }
    }

    /**
     * 主方法：交互式控制继电器
     */
    /*public static void main(String[] args) {
        UsbRelayController controller = new UsbRelayController();
        String portName = findUsbRelayPort();

        if (portName == null) {
            return;
        }

        if (controller.init(portName)) {
            try (Scanner scanner = new Scanner(System.in)) {
                boolean running = true;
                while (running) {
                    System.out.println("\n==== USB继电器控制菜单 ====");
                    System.out.println("1. 打开继电器");
                    System.out.println("2. 关闭继电器");
                    System.out.println("3. 退出程序");
                    System.out.print("请选择操作: ");

                    if (scanner.hasNextInt()) {
                        int choice = scanner.nextInt();
                        switch (choice) {
                            case 1:
                                controller.sendCommand(CMD_ON);
                                break;
                            case 2:
                                controller.sendCommand(CMD_OFF);
                                break;
                            case 3:
                                running = false;
                                break;
                            default:
                                System.out.println("无效选择，请重新输入");
                        }
                    } else {
                        scanner.next(); // 清除无效输入
                        System.out.println("请输入数字选项");
                    }
                }
            } finally {
                controller.close();
            }
        }
    }*/

    public static void main(String[] args) {
        UsbRelayController controller = new UsbRelayController();
        String portName = findUsbRelayPort();

        if (portName == null) {
            return;
        }

        if (controller.init(portName)) {
            try {
                // 自动循环参数
                int loopCount = 100;  // 循环次数
                int onTimeMillis = 3000;  // 开启时间(毫秒)
                int offTimeMillis = 1000; // 关闭时间(毫秒)

                System.out.println("开始自动循环控制，开3秒关1秒，共" + loopCount + "次");

                for (int i = 1; i <= loopCount; i++) {
                    System.out.println("\n==== 循环 " + i + "/" + loopCount + " ====");

                    // 打开继电器
                    System.out.println("打开继电器...");
                    controller.sendCommand(CMD_ON);
                    Thread.sleep(onTimeMillis); // 等待3秒

                    // 关闭继电器
                    System.out.println("关闭继电器...");
                    controller.sendCommand(CMD_OFF);
                    Thread.sleep(offTimeMillis); // 等待1秒

                    // 显示进度
                    System.out.println("循环进度: " + (i * 100 / loopCount) + "%");
                }

                System.out.println("自动循环完成！");

            } catch (InterruptedException e) {
                System.err.println("循环被中断: " + e.getMessage());
            } finally {
                controller.close();
            }
        }
    }
}